#include "ls1x.h"
#include "Config.h"
#include "ls1x_gpio.h"
#include "ls1x_latimer.h"
#include "esp8266.h"
#include "ls1c102_interrupt.h"
#include "iic.h"
#include "oled.h"
#include "dht11.h"
#include "BEEP.h"
#include "key.h"
#include "led.h"
#include "ls1c102_adc.h"
#include "fhum.h"
#include "queue.h"
#include "ls1x_clock.h"
#include "ZigBee.h"
#define LED 20
#define DATA_PACKET_LENGTH 8    // 温湿度数据包长度
#define ALARM_PACKET_LENGTH 6   // 火灾雨水报警数据包长度

char str[50];
static uint16_t temp;
static uint16_t humi;
static uint16_t fhum;
static uint16_t Flame;
static uint16_t rain;

unsigned short value;
uint8_t received_data = 0;
uint8_t Read_Buffer[255]; // 设置接收缓冲数组
uint8_t Read_length;
uint8_t da = 0;
uint8_t arr[5] = {0, 0, 0, 0, 0, 0};
uint8_t temp_hum_data[DATA_PACKET_LENGTH] = {0x55, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB}; // 温湿度数据包
uint8_t alarm_data[ALARM_PACKET_LENGTH] = {0x56, 0x00, 0x00, 0x00, 0x00, 0xCC};             // 火灾雨水报警数据包

int main(int arg, char *args[])
{
    SystemClockInit(); // 时钟等系统配置
    GPIOInit();        // io配置
    OLED_Init();
    EnableInt(); // 开总中断
    DL_LN3X_Init(DL_LN3X_NODE, CHANNEL, Network1_Id);
    BEEP_Init();
    Uart0_init(9600); // 串口0初始化，波特率9600
    Uart1_init(9600);
    Queue_Init(&Circular_queue);
    OLED_Show_Str(10, 0, "ZigBee Host", 16); // OLED鏄剧ず鐣岄潰
    delay_s(5);
    while (1) {
        sprintf(str, "温度: %2d ℃", temp / 10);
        OLED_Show_Str(5, 4, str, 16);    // OLED显示界面
        sprintf(str, "湿度: %2d %%RH", humi / 10);
        OLED_Show_Str(5, 6, str, 16);    // OLED显示界面
        // 检查队列是否为空，如果不为空，则处理接收到的数据
        if (Queue_isEmpty(&Circular_queue) == 0) // 判断队列是否为空，即判断是否收到数据
        {
            Read_length = Queue_HadUse(&Circular_queue);           // 返回队列中数据的长度
            Queue_Read(&Circular_queue, Read_Buffer, Read_length); // 读取队列缓冲区的值到接收缓冲区

            // 根据接收到的数据类型，更新相应的传感器数据
            if (Read_Buffer[6] == 0x04)
            {
                // 解析传感器数据
                temp = (Read_Buffer[7] << 8) | Read_Buffer[8];
                humi = (Read_Buffer[9] << 8) | Read_Buffer[10];
                fhum = (Read_Buffer[11] << 8) | Read_Buffer[12];
                rain = (Read_Buffer[13] << 8) | Read_Buffer[14];
                Flame = (Read_Buffer[15] << 8) | Read_Buffer[16];
            
                // 填充温湿度数据
                temp_hum_data[2] = temp / 10;     // 温度值（整数部分）
                temp_hum_data[3] = humi / 10;     // 湿度值（整数部分）
                temp_hum_data[4] = fhum; 
                temp_hum_data[6] = (temp_hum_data[2] + temp_hum_data[3] + temp_hum_data[4] + temp_hum_data[5]) % 256;
                
                // 填充报警数据
                alarm_data[1] = Flame;     // 火灾状态（1=有，0=无）
                alarm_data[2] = rain;      // 雨水状态（1=有，0=无）
                alarm_data[4] = (alarm_data[1] + alarm_data[2] + alarm_data[3]) % 256;
            
                // 发送策略优化：先发送报警数据，再发送温湿度数据
                // 无论是否有报警，保持发送顺序一致
                UART_SendDataALL(UART1, alarm_data, ALARM_PACKET_LENGTH);
                
                // 如果有报警，增加额外的报警发送次数
                if (Flame == 1 || rain == 1)
                {
                    delay_ms(500);
                    UART_SendDataALL(UART1, alarm_data, ALARM_PACKET_LENGTH);
                    delay_ms(500);
                    UART_SendDataALL(UART1, alarm_data, ALARM_PACKET_LENGTH);
                }
                
                // 发送温湿度数据
                UART_SendDataALL(UART1, temp_hum_data, DATA_PACKET_LENGTH);
                
                // 主循环延时
                delay_ms(2000);  // 发送间隔2秒
                
                // 清空接收缓冲区
                memset(Read_Buffer, 0, 255); 
            }
                
           
        }
        else
        {
            memset(Read_Buffer, 0, 255); // 填充接收缓冲区为0
        }
    }

    return 0;
}